#ifndef MESSAGE_H
#define MESSAGE_H
#include "ex13_36.cpp"
#include <set>
#include <string>

using namespace std;
class Message {
  friend class Folder;

public:
  explicit Message(const string &str = "") : contents(str) {}
  Message(const Message &m) : contents(m.contents), folders(m.folders) {
    add_to_Folders(m);
  }
  Message &operator=(const Message &mm) {
    remove_from_Folders();
    contents = mm.contents;
    folders = mm.folders;
    add_to_Folders(mm);
  }
  void swap(Message &m1, Message &m2) {
    using std::swap;
    //先将每个message从其folders中删除
    for (auto f : m1.folders) {
      f->remMsg(this); //所有包含此message的folder进行删除操作
    }
    for (auto f : m2.folders) {
      f->remMsg(this); //所有包含此message的folder进行删除操作
    }
    swap(m1.folders, m2.folders);
    swap(m1.contents, m2.contents);
    for (auto f : m1.folders) {
      f->addMsg(this); //再进行添加操作
    }
    for (auto f : m2.folders) {
      f->addMsg(this);
    }
  }
  ~Message() { remove_from_Folders(); }
  void save(Folder &);
  void remove(Folder &); //对Folder类的操作函数
private:
  string contents;
  set<Folder *> folders;
  void add_to_Folders(const Message &);
  void remove_from_Folders();
};
void Message::save(Folder &f) {
  folders.insert(&f);
  f.addMsg(this);
}
void Message::remove(Folder &f) {
  folders.erase(&f);
  f.remMsg(this);
}
void Message::add_to_Folders(const Message &m) {
  for (auto f : m.folders)
    f->addMsg(this);
}
void Message::remove_from_Folders() {
  for (auto f : folders) {
    f->remMsg(this); //所有包含此message的folder进行删除操作
  }
}

#endif